/*
 * Created on 24/06/2005
 *
 */
package com.master.bd.calculo_frete;

import java.sql.*;

import com.master.ed.*;
import com.master.root.*;
import com.master.util.*;
import com.master.util.bd.*;

/**
 *
 *
 */
public class Calcula_Frete_Rodov01
    extends Calcula_Frete {

  public Calcula_Frete_Rodov01 (ExecutaSQL executasql) {
    super (executasql);
    // //  ("Calcula_Frete_Rodov01 1");
  }

  public void calcula (Calcula_FreteED ed) throws Excecoes {

    // //  ("Calcula_Frete_Rodov01 VL_Nota_Fiscal=" + ed.getVL_Nota_Fiscal ());

    Localiza_Tabela = new Localiza_Tabela (this.executasql);

    Tabela_FreteBean tabelaFreteED = new Tabela_FreteBean ();

    ed.setLocalizado ("N");
    ed.setDM_Tem_Cidade ("S");
    ed.setDM_Tem_Peso ("N");
    ed.setDM_Tem_Modal ("N");
    ed.setDM_Tem_Validade ("N");
    ed.setDM_Tem_Vigencia ("N");
    ed.setDM_Tem_Empresa ("N");
    ed.setDM_Tem_Regiao_Estado ("N");
    ed.setDM_Tem_Estado ("S");
    ed.setDM_Tem_Subregiao ("S");
    ed.setDM_Tem_Regiao_Pais ("N");
    ed.setDM_Tem_Pais ("S");
    ed.setDM_Tabela_Reversa ("N");
    ed.setDM_Tem_Tabela_Unidade ("S");
    ed.setDM_Tem_Produto ("S");

    if ("2".equals (ed.getDM_Tipo_Conhecimento ())) {
      this.calculaFreteCortesia (tabelaFreteED , ed);

    }
    else {
      ed.setDM_Percurso_Busca ("Origem_Destino");
      if ("3".equals (ed.getDM_Tipo_Conhecimento ())) {
        ed.setDM_Percurso_Busca ("Destino_Origem");
      }

      tabelaFreteED = Localiza_Tabela.escolheTabela (ed);

      if ("S".equals (tabelaFreteED.getDM_Localizado ())) {
        // //  ("achou tabela ");

        this.calculaFretePeso (tabelaFreteED , ed);
        this.calculaFreteValor (tabelaFreteED , ed);
        this.calculaAdemeGris (tabelaFreteED , ed);
        this.calculaSuframa (tabelaFreteED , ed);
        this.calculaFluvial (tabelaFreteED , ed);
        this.calculaPedagio (tabelaFreteED , ed);
        this.calculaDespacho (tabelaFreteED , ed);

        // //  ("calculou tudo ");

      }
    }
  }

  protected void calculaFretePeso (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------FRETE PESO--------------------------------------------------
    Tipo_Movimento = "FP";
    VL_Movimento_Frete = 0;

    String tipo_tab = "FRACIONADA";

    if (tabelaFreteED.getVL_R_Ate20 () <= 0 && tabelaFreteED.getVL_R_Ate7500 () > 0) {
      tipo_tab = "COMPLETA";
    }
    if (tabelaFreteED.getVL_R_Ate20 () > 0 && tabelaFreteED.getVL_R_Ate7500 () > 0 && ed.getNR_Peso_Cubado () > 200) {
      tipo_tab = "COMPLETA";
    }

    // //  ("CALC rodoviario NOVO ->>" + tipo_tab);

    if ("FRACIONADA".equals (tipo_tab)) { ///RONALDO
      //// // ("fracionada ");
      //// // (" peso  " + NR_Peso_Tabela + " ate 30 " + calcula_frete_FracionadoED.getVL_R_Ate30());

      if (ed.getNR_Peso_Cubado () < 11) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate10 ();
      }
      else if (ed.getNR_Peso_Cubado () < 21) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate20 ();
      }
      else if (ed.getNR_Peso_Cubado () < 31) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate30 ();
      }
      else if (ed.getNR_Peso_Cubado () < 51) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate50 ();
      }
      else if (ed.getNR_Peso_Cubado () < 71) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate70 ();
      }
      else if (ed.getNR_Peso_Cubado () < 101) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate100 ();
      }
      else if (ed.getNR_Peso_Cubado () < 151) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate150 ();
      }
      else if (ed.getNR_Peso_Cubado () < 201) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate200 ();
      }

      if (VL_Movimento_Frete == 0.0 || ed.getNR_Peso_Cubado () > 200) {
        VL_Movimento_Frete = (tabelaFreteED.getVL_R_Ate200 () +
                              (tabelaFreteED.getVL_R_Acima200 () *
                               (ed.getNR_Peso_Cubado () - 200)));
      }

      if (VL_Movimento_Frete < tabelaFreteED.getVL_R_Ate10 ()) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate10 ();
      }
    }
    else {
      if (ed.getNR_Peso_Cubado () <= 7500) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate7500 () * ed.getNR_Peso_Cubado () / 1000;
      }
      else if (ed.getNR_Peso_Cubado () <= 14500) {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate14500 () * 14.5;
      }
      else {
        VL_Movimento_Frete = tabelaFreteED.getVL_R_Acima14500 () * 25.5;
      }
    }
    if (VL_Movimento_Frete < tabelaFreteED.getVL_R_Ate10 ()) {
      VL_Movimento_Frete = tabelaFreteED.getVL_R_Ate10 ();
    }

    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

  protected void calculaFreteValor (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------AD VALOREM--------------------------------------------------
    Tipo_Movimento = "AV";
    VL_Movimento_Frete = 0;

    if (tabelaFreteED.getVL_R_Ate7500 () <= 0) {

      VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_Ad_Valorem () / 100);
      if (VL_Movimento_Frete < tabelaFreteED.getVL_Ad_Valorem_Minimo ()) {
        VL_Movimento_Frete = tabelaFreteED.getVL_Ad_Valorem_Minimo ();
      }
    }
    else {
      // --------------------AD VALOREM completa-----------------------------------------
      if (ed.getNR_Peso_Cubado () <= 7500) {
        VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_Ad_Valorem () / 100);
        if (VL_Movimento_Frete < tabelaFreteED.getVL_Ad_Valorem_Minimo ()) {
          VL_Movimento_Frete = tabelaFreteED.getVL_Ad_Valorem_Minimo ();
        }
      }
      else {
        VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_AD_Valorem2 () / 100);
        if (VL_Movimento_Frete < tabelaFreteED.getVL_Ad_Valorem_Minimo ()) {
          VL_Movimento_Frete = tabelaFreteED.getVL_Ad_Valorem_Minimo ();
        }
      }
    }

    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

  protected void calculaAdemeGris (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------ADEME/GRIS--------------------------------------------------

    Tipo_Movimento = "ADM";
    VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_Ademe () / 100);
    if (VL_Movimento_Frete < tabelaFreteED.getVL_Ademe_Minimo ()) {
      VL_Movimento_Frete = tabelaFreteED.getVL_Ademe_Minimo ();
    }

    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

  protected void calculaSuframa (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------Suframa--------------------------------------------------
    if ("S".equals (ed.getDM_Suframa ())) {
      Tipo_Movimento = "SUF";
      VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_Suframa () / 100);
      VL_Movimento_Frete += tabelaFreteED.getVL_Suframa_Minimo ();
      ed.setCD_Tipo_Movimento (Tipo_Movimento);
      ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
      ed.setVL_Movimento (VL_Movimento_Frete);
      this.incluiMovimento (ed);

    }
  }

  protected void calculaFluvial (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------Fluvial--------------------------------------------------
    if ("S".equals (ed.getDM_Fluvial ())) {
      Tipo_Movimento = "FLU";
      VL_Movimento_Frete = (ed.getVL_Nota_Fiscal () * tabelaFreteED.getPE_Fluvial () / 100);
      if (VL_Movimento_Frete < tabelaFreteED.getVL_Fluvial_Minimo ()) {
        VL_Movimento_Frete = tabelaFreteED.getVL_Fluvial_Minimo ();
      }
      ed.setCD_Tipo_Movimento (Tipo_Movimento);
      ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
      ed.setVL_Movimento (VL_Movimento_Frete);
      this.incluiMovimento (ed);

    }
  }

  protected void calculaDespacho (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------DESPACHO----------------------------------------------------

    Tipo_Movimento = "DP";
    VL_Movimento_Frete = tabelaFreteED.getVL_Despacho ();
    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

  protected void calculaPedagio (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------PEDAGIO-----------------------------------------------------
    Tipo_Movimento = "PED";

    VL_Movimento_Frete = tabelaFreteED.getVL_Pedagio ();
    if (ed.getNR_Peso_Cubado () > 100) {
      if ("17/09/2007".equals(tabelaFreteED.getDT_Vigencia()) ||
          "2007-09-17".equals(tabelaFreteED.getDT_Vigencia() )){
        VL_Movimento_Frete = (ed.getNR_Peso_Cubado () / 100 * 1.45);
      }else{
        VL_Movimento_Frete = (ed.getNR_Peso_Cubado () / 100 * 0.96);
      }
    }

    if (VL_Movimento_Frete < tabelaFreteED.getVL_Pedagio ()) {
      VL_Movimento_Frete = tabelaFreteED.getVL_Pedagio ();
    }

    if (tabelaFreteED.getDM_Tipo_Pedagio () != null && tabelaFreteED.getDM_Tipo_Pedagio ().equals ("C")) {
      VL_Movimento_Frete = tabelaFreteED.getVL_Pedagio ();
    }

    if (tabelaFreteED.getVL_Pedagio_Minimo()>VL_Movimento_Frete) {
      VL_Movimento_Frete = tabelaFreteED.getVL_Pedagio_Minimo ();
    }

    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

  protected void calculaFreteCortesia (Tabela_FreteBean tabelaFreteED , Calcula_FreteED ed) throws Excecoes {
    // --------------------CORTESIA TIPO(2)--------------------------------------------
    Tipo_Movimento = "FP";
    VL_Movimento_Frete = parametro_FixoED.getVL_Frete_Cortesia ();
    ed.setCD_Tipo_Movimento (Tipo_Movimento);
    ed.setOID_Tabela_Frete (String.valueOf (tabelaFreteED.getOID ()));
    ed.setVL_Movimento (VL_Movimento_Frete);
    this.incluiMovimento (ed);

  }

}
